package com.sogoodsoft.core.dao;

import java.io.Serializable;
import java.util.List;

import com.sogoodsoft.core.support.Page;


public interface EntityDao<T, PK extends Serializable> {

	/**
	 * 根据主键ID查询
	 * 
	 * @param id
	 * 
	 * @return Object
	 */
	public T load(PK id);

	/**
	 * 删除记录
	 * 
	 * @param id
	 */
	public void delete(PK id);

	/**
	 * 保存记录
	 * 
	 * @param entity
	 */
	public void save(T entity);

	/**
	 * 更新记录
	 * 
	 * @param entity
	 * 
	 * @return E
	 */
	public T update(T entity);

	/**
	 * 查询所有数据
	 * 
	 * @return List<E>
	 */
	public List<T> find();

	/**
	 * 带条件的查询所有数据
	 * 
	 * @param entity
	 *            实体
	 * 
	 * @return List<E>
	 */
	public List<T> find(final T entity);

	/**
	 * 带条件和排序的查询数据
	 * 
	 * @param entity
	 *            实体
	 * 
	 * @param orderBy
	 *            排序字段
	 * 
	 * @param isAsc
	 *            true:asc false:desc
	 * 
	 * @return List<E>
	 */
	public List<T> find(final T entity, final String orderBy, final boolean isAsc);

	/**
	 * 带条件和参数的查询语句
	 * 
	 * @param queryString
	 *            查询条件
	 * 
	 * @param values
	 *            参数
	 * 
	 * @return List<E>
	 */
	public List<T> find(final String queryString, final Object... values);

	/**
	 * 分页查询记录
	 * 
	 * @param entity
	 *            实体
	 * 
	 * @param pageNo
	 *            起始位置
	 * 
	 * @param pageSize
	 *            数量
	 * 
	 * @return Page
	 */
	public Page findPaged(T entity, int pageNo, int pageSize);
	
	/**
	 * @param entity
	 * @param pageNo
	 * @param pageSize
	 * @param orderBy
	 * @param isAsc
	 * @return
	 */
	public Page findPaged(T entity, int pageNo, int pageSize, String orderBy, boolean isAsc);
	
	/**
	 * @param queryString
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	public Page findPaged(String queryString, int pageNo, int pageSize, Object... values);
	
	/**
	 * 验证重复字段
	 * @param entity
	 * @param field
	 * @param fieldValue
	 * @param id
	 * @return
	 */
	public boolean repeatValidation(final String entity, final String field, final String fieldValue,final String id);

}
